package cn.com.ejiakanghu.web.common;


import cn.com.ejiakanghu.annotation.LoginUser;
import cn.com.ejiakanghu.core.utils.RespUtil;
import cn.com.ejiakanghu.core.vo.BaseResult;
import cn.com.ejiakanghu.form.AddGoodsForm;
import cn.com.ejiakanghu.service.CartManager;
import cn.com.ejiakanghu.vo.CartItemVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.linlinjava.litemall.db.domain.LitemallCart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/cart")
@Slf4j
public class CartController {
    private Logger logger = LoggerFactory.getLogger(CartController.class);
    @Autowired
    private CartManager cartManager;

    /**
     * 用户购物车信息
     * @api {post} /cart/list 用户购物车信息
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 获取用户购物车信息
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @GetMapping("/list")
    public BaseResult listUserCart(@LoginUser Integer userId){

        logger.info("CartController.listUserCart userId:{}",1111);
        return cartManager.index(userId);
    }

    /**
     * 添加购物车
     * @api {post} /cart/add 添加购物车
     * @apiParam {number} goodsId 商品id
     * @apiParam {number} productId 具体商品id
     * @apiParam {number} number 购买的数量
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 添加购物车
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("add")
    public BaseResult add(@LoginUser Integer userId, LitemallCart cart) {
        return cartManager.add(userId, cart);
    }

     /**
      *
      * @api {post} /cart/fastadd 立即购买
      * @apiParam {number} goodsId 商品id
      * @apiParam {number} productId 具体商品id
      * @apiParam {number} number 购买的数量
      * @apiGroup 购物车
      * @apiVersion 0.1.0
      * @apiDescription 立即购买
      * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
      * @apiSuccess {String} message 结果消息说明
      * @apiSuccess {boolean} success 请求是否成功
      * @apiSuccess {Object} data 请求响应的数据
      * @apiSuccessExample {json} Success-Response:
      * {
      * "code": "请求状态码，0表示成功，其它参考状态码文档",
      * "success": "请求是否成功",
      * "timestamp": "服务器当前时间戳10位精确到秒",
      * "message": "请求成功/失败说明",
      * "data": "请求响应数据，对象或数组"
      * }
     */
    @RequestMapping("fastadd")
    public BaseResult fastadd(@LoginUser Integer userId, LitemallCart cart) {
        return cartManager.fastadd(userId, cart);
    }

    /**
     * @api {post} /cart/update 修改数量
     * @apiParam {number} id 购物车物品记录id
     * @apiParam {number} goodsId 商品id
     * @apiParam {number} productId 具体商品id
     * @apiParam {number} number 购买的数量
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 修改商品的数量
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("update")
    public BaseResult update(@LoginUser Integer userId, LitemallCart cart) {
        return cartManager.update(userId, cart);
    }

    /**
     * @api {post} /cart/checked 货品勾选
     * @apiParam {String} productIds 购物车物品记录id,多个逗号分隔
     * @apiParam {number} isChecked 是否勾选 1勾选 0取消勾选
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 货品勾选
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("checked")
    public BaseResult checked(@LoginUser Integer userId,String productIds, Integer isChecked) {
        List<Integer> pIdList = null;
        if(StringUtils.isNotBlank(productIds)) {
            pIdList = new ArrayList<>();
            String[] idArr = productIds.split(",");
            for(String id:idArr) {
                pIdList.add(Integer.parseInt(id));
            }
        }
        return cartManager.checked(userId, pIdList, isChecked);
    }

    /**
     * @api {post} /cart/delete 购物车商品删除
     * @apiParam {String} productIds 购物车物品记录id,多个逗号分隔
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 购物车商品删除
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("delete")
    public BaseResult delete(@LoginUser Integer userId, String productIds) {
        List<Integer> pIdList = null;
        if(StringUtils.isNotBlank(productIds)) {
            pIdList = new ArrayList<>();
            String[] idArr = productIds.split(",");
            for(String id:idArr) {
                pIdList.add(Integer.parseInt(id));
            }
        }
        return cartManager.delete(userId, pIdList);
    }

    /**
     * @api {post} /cart/checkout 购物车下单
     * @apiParam {number} cartId 购物车单个物品记录id,不上传则以购物车已勾选的物品
     * @apiParam {number} addressId 地址id
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 购物车下单
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("checkout")
    public BaseResult checkout(@LoginUser Integer userId, Integer cartId, Integer addressId, Integer couponId, Integer userCouponId, Integer grouponRulesId) {
        return cartManager.checkout(userId, cartId, addressId, couponId, userCouponId, grouponRulesId);
    }


    @GetMapping("/exception")
    public BaseResult ExceptionTest(){


        List<CartItemVo> cartItemVoList = null;
        logger.info("测试异常",cartItemVoList.size());
        return RespUtil.success(cartItemVoList);
    }

    /**
     * 商品详情加入购物车添加商品到购物车
     * @api {post} /cart/addGoods 商品详情加入购物车添加商品到购物车
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {object} mainGoods 加入购物车的主商品
     * @apiParam {array} fitGoodsList 主商品下附加的推荐商品列表
     * @apiParam {array} packGoodsList 主商品下附加的组合打包商品列表
     * @apiParam {int} saleUserId 推广员用户ID
     * @apiDescription 商品详情加入购物车添加商品到购物车
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/addGoods")
    public BaseResult addGoods(@LoginUser Integer userId, @RequestBody AddGoodsForm addGoodsForm) {
        return cartManager.addGoods(userId, addGoodsForm);
    }

    /**
     * 购物车批量删除购物车中的商品
     * @api {post} /cart/removeBatch
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {String} groupIds 购物车分组ID，多个英文逗号分隔
     * @apiDescription 购物车批量删除购物车中的商品
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/removeBatch")
    public BaseResult removeBatch(@LoginUser Integer userId, @RequestParam String groupIds) {
        return cartManager.removeBatch(userId, groupIds);
    }

    /**
     * 购物车获取购物车全部分组商品列表信息
     * @api {post} /cart/cartList
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 购物车获取购物车全部分组商品列表信息
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/cartList")
    public BaseResult cartList(@LoginUser Integer userId) {
        return cartManager.cartList(userId);
    }

    /**
     * 购物车---获取医院小时达购物车全部分组商品列表信息
     * @api {post} /cart/hospitalCartList
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiDescription 购物车获取购物车全部分组商品列表信息
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/hospitalCartList")
    public BaseResult hospitalCartList(@LoginUser Integer userId) {
        return cartManager.hospitalCartList(userId);
    }

    /**
     * 获取购物车页面推荐商品列表
     * @api {post} /cart/recommendList
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {number} page 分页获取第几页数据
     * @apiParam {number} pageSize 分页每页的数据条数
     * @apiDescription 获取购物车页面推荐商品列表
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/recommendList")
    public BaseResult recommendList(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) {
        return cartManager.recommendList(page, pageSize);
    }

    /**
     * 购物车修改指定购物车分组下的商品购买数量
     * @api {post} /cart/updateCartStock
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {number} cartId 要修改购买数量的购物车ID
     * @apiParam {number} stock 要修改的购买数量
     * @apiDescription 购物车修改指定购物车分组下的商品购买数量
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/updateCartStock")
    public BaseResult updateCartStock(@LoginUser Integer userId, @RequestParam Integer cartId, @RequestParam Integer stock) {
        return cartManager.updateCartStock(userId, cartId, stock);
    }

    /**
     * 购物车选择多个分组去支付确认订单
     * @api {post} /cart/createOrder
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {number} addressId 用户选择的收货地址ID
     * @apiParam {String} groupIds 购物车分组ID，多个用英文逗号分隔
     * @apiDescription 购物车选择多个分组去支付确认订单
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/createOrder")
    public BaseResult createOrder(@LoginUser Integer userId, @RequestParam Integer addressId, @RequestParam String groupIds,
                                  @RequestParam Integer isHospitalUrgent, @RequestParam(required = false) Integer hosId) {
        return cartManager.createOrder(userId, addressId, groupIds, isHospitalUrgent, hosId);
    }

    @PostMapping("/getHospitalList")
    public BaseResult getHospitalList(@LoginUser Integer userId, @RequestParam String groupIds) {
        return cartManager.getHospitalList(userId, groupIds);
    }

    /**
     * 用户订单-用户操作-加入购物车（将订单中的商品重新加入购物车）
     * @api {post} /cart/saveOrderToCart
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {number} bigOrderId 大订单ID
     * @apiParam {number} subOrderId 子订单ID
     * @apiDescription 用户订单-用户操作-加入购物车（将订单中的商品重新加入购物车）
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/saveOrderToCart")
    public BaseResult saveOrderToCart(@LoginUser Integer userId, @RequestParam String bigOrderId, @RequestParam String subOrderId) {
        return cartManager.saveOrderToCart(userId, bigOrderId, subOrderId);
    }
}
